import http from 'wechat-http'

// 接口基础地址
http.baseURL = 'https://live-api.itheima.net'

// 请求拦截器
http.intercept.request = (options) => {
  // console.log(options); // 发送请求的配置对象信息
  // 指定默认的头信息
  const defaultHeader = {}
  // 权限认证
  if (getApp().token) {
    defaultHeader.Authorization = `Bearer ${getApp().token}`
  }
  // 合并头信息 优化写法, 为了保证如果options的header中有别的字段 不会被覆盖掉  而是合并到一起
  options.header = Object.assign({}, defaultHeader, options.header)
  // 拦截器处理后的请求参数
  return options
}

// 响应拦截器
http.intercept.response = async ({
  statusCode, // 响应的状态码
  data, // 响应的数据
  config // 发送这一次请求的配置信息
}) => {
  console.log(statusCode) // http 响应状态码
  // console.log(config) // 发起请求时的参数
  if (statusCode === 401) { // 1. 进入这个分支说明 token失效了, 需要刷新一份新的token (核心携带refreshToken发送一个请求, 取回来新token就可以)
    console.log('token失效了, 需要刷新一份新的token');
    if (config.url.includes('/refreshToken')) {
      console.log('退出重新登录了');
      // 1. 清除掉坏的token和refreshToken 
      getApp().setTokenInfo('token', null)
      getApp().setTokenInfo('refreshToken', null)
      // 2. 跳转到登录页面重新登录
      wx.redirectTo({
        url: '/pages/login/index',
      })
      // 3. 一定要return 终止掉
      return
    }
    // 2. 携带refreshToken获取新token 
    const res = await wx.http({
      method: 'post',
      url: '/refreshToken',
      header: {
        Authorization: `Bearer ${getApp().refreshToken}`
      }
    })
    // 3. 将获取回来的新token重新存储在本地和app实例中
    getApp().setTokenInfo('token', res.data.token)
    getApp().setTokenInfo('refreshToken', res.data.refreshToken)

    // 需要重新发送执行一次本来要发送的请求
    // console.log(config); // 就是上次发送请求的配置对象,但是token是坏的
    return wx.http({
      ...config,
      header: {
        Authorization: `Bearer ${getApp().token}`
      }
    })
  }
  // 拦截器处理后的响应结果
  return data // 数据剥离
}

// 挂载到 wx 全局命名空间
wx.http = http

// 也可作为模块导出
export default http

// 单token  人资 单token  token失效重新登录

// 使用双token认证实现无感刷新 (token + refreshToken)

// 平常发送请求 在请求头中携带的是token, 但是token是有过期时间的(一般2/4h), token失效后 会在响应拦截器中 进行状态码401的判, 如果进入401判断的分支 说明token过期了, 此时需要发送一次请求(携带的是refreshToken)获取一份新token即可, 将取到新token重新存储一次

// 存储完毕新token后  做无感请求 在存储好新token后 重新发送一次上一次的请求, 需要将请求头中的token覆写为新的token

// 当refreshToken失效后 , 清除掉失效的token和refreshToken 重新登录即可  重新登录完毕后 重新存储新的token和refreshToken